package material.encapsulation_algorithm.sort;

public class SortUtils {
    /**
     * 第一个方法sort()只是一个辅助(helper)方法、用来创建一个数组的拷贝，然后将其传
     * 递给mergeSort()方法当作目标数组。同时传入mergeSort()的参数，还包括数组的长度、以及从
     * (0)开始排序。
     *
     * @param a
     */
    public static void sort(Object[] a) {
        Object aux[] = (Object[]) a.clone();
        mergeSort(aux, a, 0, a.length, 0);
    }

    /**
     * mergeeSort()方法包含排序算，此算法依赖于compareTo()方法实现
     *
     * @param src
     * @param dest
     * @param low
     * @param high
     * @param off
     */
    private static void mergeSort(Object[] src, Object dest[], int low, int high, int off) {//此处可以看成是一个模板方法
        for (int i = low; i < high; i++) {
            for (int j = i; j > low && ((Comparable) dest[j - 1]).compareTo((Comparable) dest[j]) > 0; j--) {
                swap(dest, j, j - 1);
            }
        }
        return;
    }

    /**
     * 交换i,j的值
     *
     * @param src
     * @param i
     * @param j
     */
    private static void swap(Object[] src, int i, int j) {
        Object temp = src[i];
        src[i] = src[j];
        src[j] = temp;
    }

}
